package org.xianyu.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.xianyu.domain.entity.Order;
import org.xianyu.domain.enums.OrderStatus;

import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 订单数据访问接口
 * 定义了订单的增删改查操作
 */
@Mapper
public interface OrderMapper {
    /**
     * 根据ID查询订单
     * @param id 订单ID
     * @return 订单对象，如果不存在返回null
     */
    Order selectById(@Param("id") Long id);

    /**
     * 查询所有订单，支持条件筛选和排序
     * @param product 产品名称，可为空
     * @param status 订单状态，可为空
     * @param sortBy 排序字段，可选值：price, profit, order_time, end_time
     * @param sortDir 排序方向，可选值：asc, desc
     * @return 订单列表
     */
    List<Order> selectAll(
            @Param("product") String product,
            @Param("status") OrderStatus status,
            @Param("sortBy") String sortBy,         // price, profit, order_time, end_time
            @Param("sortDir") String sortDir        // asc 或 desc
    );

    /**
     * 插入新订单
     * @param order 订单对象
     * @return 受影响的行数
     */
    int insert(Order order);

    /**
     * 更新订单信息
     * @param order 订单对象
     * @return 受影响的行数
     */
    int update(Order order);

    /**
     * 根据ID删除订单
     * @param id 订单ID
     * @return 受影响的行数
     */
    int delete(@Param("id") Long id);



    /**
     * 统计符合条件的总条数（用于分页）
     */
    long count(
            @Param("product") String product,
            @Param("status") OrderStatus status
    );

    /**
     * 分页查询：在原来过滤基础上增加 offset/limit
     * offset = (page-1)*size
     */
    List<Order> selectPage(
            @Param("product") String product,
            @Param("status") OrderStatus status,
            @Param("sortBy") String sortBy,
            @Param("sortDir") String sortDir,
            @Param("offset") int offset,
            @Param("limit") int limit
    );

    /**
     * 计算在 [start, end] 区间内（基于 end_time），并且状态为给定 status 的利润总和
     * 注意返回 BigDecimal（可能为 null -> 业务层转换为 BigDecimal.ZERO）
     */
    BigDecimal sumProfitByEndTimeAndStatus(
            @Param("start") Date start,
            @Param("end") Date end,
            @Param("status") OrderStatus status
    );

    /**
     * 计算所有下单订单的价格总和（SUM(price)）
     */
    BigDecimal sumAllPrice();
}

